/*
  箭头函数
    回顾：this调用
      1. 通过对象调用函数，this执行对象
      2. 直接调用函数，this指向全局对象
      3. 如果通过new调用函数，this指向新创建的对象
      4. 如果通过apply，call，bind调用函数，this指向指定的数据
      5. 如果时DOM事件函数，this指向事件源

    使用语法
      箭头函数是一个函数表达式，理论上，任何使用函数表达式的场景都可以使用箭头函数

    注意细节
      箭头函数中，没有自己的this，super, arguments，new.target, 如果使用了，则使用的时函数外层的对应的this, super, arguments，new.target
      箭头函数没有原型
      箭头函数不能构造函数
      ！！对象的属性不能使用函数

    应用场景
      1. 临时性使用的函数，并不会可以调用他，比如：
        事件处理函数
        异步处理函数（setTimeOut）
        其他临时性函数

      2. 为了绑定外层this的函数
      
      3. 数组方法中回调函数（主要时为了简洁）
*/

// 嵌套函数this混乱
/* const obj = {
  count: 0,
  start: function () {
    console.log(this); // obj
    // es6之前
    // const self = this;
    // setInterval(function () {
    //   console.log(self); // 全局对象
    //   self.count++;
    //   console.log(self.count);
    // }, 1000);

    setInterval(() => {
      this.count++;
      console.log(this.count);
    }, 1000);
  },
  print: () => {
    // 这里的this为全局对象
    console.log(this.count);
  },
};

console.log(obj.start()); */

const print = (num) => {
  console.log(num);
};

const isOdd = (num) => num % 2 !== 0;

// 返回一条语句，并且该语句为对象时
const sum = (a, b) => ({
  a,
  b,
  sum: a + b,
});

// this, arguments为外层的
const obj = {
  method: function () {
    const func = () => {
      console.log(this);
      console.log(arguments);
    };
    func();
  },
};

obj.method(12);

const numbers = [1, 2, 3, 4];
console.log(
  numbers
    .map((v) => v ** v)
    .filter((v) => isOdd(v))
    .reduce((a, b) => a + b)
);
